package fr.ginvest.implementation;

import java.util.Collection;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import fr.ginvest.entity.Angel;
import fr.ginvest.entity.Investisseur;
import fr.ginvest.interfaces.InvestisseurFacadeRemote;

/**
 * Session Bean implementation class InvestisseurFacade
 */
@Stateless
public class InvestisseurFacade implements InvestisseurFacadeRemote {
	@PersistenceContext
	protected EntityManager entityMgr;
	
	public static final String NOM = "nom";
	public InvestisseurFacade() {
	}	

	public InvestisseurFacade(EntityManager entityMgr) {
		this.entityMgr = entityMgr;
	}


    public Investisseur addInvestisseur(Investisseur i) {
    	entityMgr.persist(i);
    	return i;
    }

	@SuppressWarnings("unchecked")
	@Override
	public Collection<Investisseur> listInvestisseurs() {
		return entityMgr.createQuery("SELECT i FROM Investisseur i").getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public Collection<Angel> listAngels() {
		return entityMgr.createQuery("SELECT a FROM Angel a").getResultList();
	}

	@Override
	public Investisseur findInvestisseurById(int id) {
		return entityMgr.find(Investisseur.class, id);
	}

	@Override
	public Investisseur updateInvestisseur(Investisseur i) {
		return entityMgr.merge(i);
	}

	@Override
	public void deleteInvestisseur(Investisseur i) {
		i = entityMgr.getReference(Investisseur.class, i.getId());
		entityMgr.remove(i);
	}

	@Override
	@SuppressWarnings("unchecked")
	public Collection<Investisseur> findInvestByLoginPwd(Object login, Object pwd) {
		final String queryString = "select model from Investisseur model where model.login= :custLogin AND model.motDePasse= :custPwd";
		Query query = entityMgr.createQuery(queryString).setParameter("custLogin", login).setParameter("custPwd", pwd);
		return query.getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public Collection<Investisseur> findByProperty(String propertyName, final Object value) {
		final String queryString = "select model from Investisseur model where model."
				+ propertyName + "= :propertyValue";
		Query query = entityMgr.createQuery(queryString);
		query.setParameter("propertyValue", value);
		return query.getResultList();
	}

	public Collection<Investisseur> findByNom(Object nom) {
		return findByProperty(NOM, nom);
	}
	
	@SuppressWarnings("unchecked")
	public Collection<Investisseur> findAll() {
		String queryString = "select model from Investisseur model where model.type <> '" + fr.ginvest.entity.Investisseur.Type.GROUPE + "'";//
		Query query = entityMgr.createQuery(queryString);
		return query.getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public Collection<Investisseur> findByRequete(Object requete){
		final String queryString = "select model from Investisseur model " + requete;
		Query query = entityMgr.createQuery(queryString);
		return query.getResultList();
	}

	@Override
	public Investisseur findInvestisseurByLogin(String login) {
		final String queryString = "select i from Investisseur i where i.login= :login";
		Query query = entityMgr.createQuery(queryString).setParameter("login", login);
		if(query.getResultList().size() == 0)
			return null;
		else
			return (Investisseur) query.getSingleResult();
	}

	@Override
	public Investisseur authenticate(String login, String password) {
		if (login == null || "".equals(login))
            return null;

		Investisseur investisseur = this.findInvestisseurByLogin(login);

        // Check if it's the right password
        if (investisseur != null){
        	if(investisseur.matchPassword(password)){
        		return investisseur;
        	} 
        }
        return null;
	}

	@SuppressWarnings("unchecked")
	@Override
	public Collection<Investisseur> findAllFondateur() {
		String queryString = "select model from Investisseur model where model.type = '" + fr.ginvest.entity.Investisseur.Type.FONDATEUR + "'";//
		Query query = entityMgr.createQuery(queryString);
		return query.getResultList();
	}
	
	
}


